﻿using System.Windows.Forms;
using System.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassFolio
{
    public class EFolio : Exception
    {
        //Constructors
        public EFolio(int id, MessageType messageType, string message, Exception error)
            : base(message, error)
        {
            this._id = id;
            this._msgType = messageType;
        }

        // Properties
        public int Id { get { return this._id; } }
        public MessageType MessageType { get { return this._msgType; } }
        
        // Статические методы обработки ошибок
        public static void HandledError(MessageType messageType, Exception exception, string messageText)
        {
            switch (messageType)
            {
                case MessageType.AllertLog:
                    MessageBox.Show(messageText);
                    using (StreamWriter sw = File.AppendText(_log))
                    {
                        sw.WriteLine(exception.Message + exception.StackTrace);
                        sw.WriteLine(messageText);
                    }
                    break;
                case MessageType.UserMessage:
                    MessageBox.Show(messageText);
                    break;
                case MessageType.SilentLog:
                    using (StreamWriter sw = File.AppendText(_log))
                    {
                        sw.WriteLine(exception.Message + exception.StackTrace);
                        sw.WriteLine(messageText);
                    }
                    break;
                default:
                    return;
            }
        }
        public static void UnHandledError(Exception exception, string messageText)
        {
            MessageBox.Show("Произошла неведомая ошибка, зер гуд Вольдемар!!!!");
            using (StreamWriter sw = File.AppendText(_log))
            {
                sw.WriteLine(exception.Message + exception.StackTrace);
                sw.WriteLine(messageText);
            }
        }
        
        // Private
        protected int _id;
        protected MessageType _msgType;
        protected static string _log = Path.ChangeExtension(Application.ExecutablePath, "log");
    }

    public class EFolioSource : EFolio
    {
        public EFolioSource(int id, MessageType msgType, string message, Exception error) 
            : base(id, msgType, message, error) { }
    }

    public class EFolioUsers : EFolio
    {
        public EFolioUsers(int id, MessageType msgType, string message, Exception error) 
            : base(id, msgType, message, error) { }
    }

    public enum MessageType
    {
        none,
        SilentLog,      // Сообщение записывается в log-файл, для пользователя не выводится
        AllertLog,      // Сообщение записывается в log-файл, и отображается для пользователя
        UserMessage     // Сообщение отображается для пользователя и не записывается в лог-файл
    }

}
